package com.sy.rabbitmq.message;

import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.sy.rabbitmq.TestProperties;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeoutException;

/**
 * rabbitmq生产端
 */
public class Procuder {
    public static void main(String[] args) throws IOException, TimeoutException {
        //1.创建一个链接工厂,配置初始化参数
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setUsername(TestProperties.getUsername());
        connectionFactory.setPassword(TestProperties.getPassword());
        connectionFactory.setHost(TestProperties.getIp());
        connectionFactory.setPort(TestProperties.getPort());
        connectionFactory.setVirtualHost("/");
        //2.创建链接
        Connection connection = connectionFactory.newConnection();

        //3.通过链接创建一个Channel,再通过Channel发送消息
        Channel channel = connection.createChannel();

        //自定义封装参数
        Map<String,Object> headers = new HashMap<>();
        headers.put("my1","111");
        headers.put("my2","222");

        AMQP.BasicProperties properties = new AMQP.BasicProperties().builder()
                //设置消息持久化必须先设置队列持久化，要不然队列不持久化，消息持久化，队列都不存在了，消息存在还有什么意义。
                // 消息持久化需要将交换机持久化、队列持久化、消息持久化，才能最终达到持久化的目的
                .deliveryMode(2)//设置消息是否持久化，1： 非持久化 2：持久化
                //设置单条消息的过期时间-如果消息没有被消费到达过期时间过自动过期
                .expiration("10000")
                //自定义属性
                .headers(headers)
                .build();

        //4.发送消息
        for(int i =0;i<5;i++){
            String msg = "testetstetst";
            //向队列发送消息,exchange如果未指定那么走默认的exchange直接根据routingKey匹配队列名,properties消费配置和附带属性
            channel.basicPublish("","test001",properties,msg.getBytes());
        }
        channel.close();
        connection.close();
    }
}
